#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <math.h>

void crivo(int n)
{
    double raiz = sqrt(n);
    int i, j, k, numeros[n];

    for(k=2;k<=n;k++)
        numeros[k] = k;

    for (i=2; i<=raiz; i++)
        if (numeros[i] == i)
            for(j=i*i; j<=n; j=j+i)
                numeros[j] = 0;

     printf("   %d  ", n);
    if(numeros[n] == 0)
        printf(" > não é primo.");
    else
        printf(" > é primo.");
}

void primo(char palavra[100], int tam){
    int i, soma=0;

    for(i=0; i<=tam;i++)
        soma += palavra[i];

    crivo(soma);
}

int main(){

    FILE *f;
    int tam=0, inicio, fim, cont=0, n_caracteres_txt, i;
    char *texto, c, palavra[100];

    f = fopen("wikipedia.txt", "r");

    fseek(f, 0, SEEK_END); //posiciona o cursor no fim do arquivo

    n_caracteres_txt = ftell(f); //a ultima posicao do arquivo é igual ao numero de caracteres no txt

    texto = (char *) malloc(n_caracteres_txt*sizeof(char)); //alocando memoria para o numero total de caracteres do txt

    if(texto == NULL) {
            printf("Malloc devolveu NULL!\n");
            exit(1);
    }

    fseek(f, 0, SEEK_SET); //posiciona o cursor no inicio do txt
    for(i=0;i<n_caracteres_txt;i++) //para o primeiro caracter do txt, até o ultimo
        texto[i] = fgetc(f); //copia o caracter para a memoria

    fclose(f);

    for(i=0;i<n_caracteres_txt;i++){  //para i=0 até i=numero de caracteres do txt
        c = texto[i];

        if((c >= 48 && c <= 57) || (c >= 65 && c<= 90) || (c >= 97 && c<= 122)){ //se for letra(maiuscula ou minuscula) ou numero
            palavra[tam] = c; //adiciona o caracter ao vetor palavra
            tam++; //tamanho do vetor é incrementado
        }

        else if(c != 39){ // se c == ', ele nao faz nada. Vai pra proxima iteraçao do while
            if(palavra[0] != 0){ //se já tem algum caracter no vetor palavra, vai ser analisada a ocorrencia de palindromo
                inicio = 0;   //inicio da palavra
                fim = tam-1;  //fim da palavra

                if(tam % 2 == 1) //se a palavra tem numero impar de letras
                    tam = tam-1; //a iteração do for a seguir decrementada

                for(inicio; inicio<(tam/2);){
                    if(palavra[inicio] != palavra[fim]){ //se a primeira e ultima letra forem diferentes, nao é palindromo. O mesmo é verificado para as proximas letras
                        break;
                    }
                    else{
                        if(inicio == (tam/2)-1){ //se chegar ao meio da palavra, quer dizer que é um palindromo
                            printf("\n%s", palavra);
                            primo(palavra, tam);
                            cont++; //contador de palindromos
                        }
                    }

                    inicio++; //incrementa a primeira letra
                    fim--;    //decrementa a ultima letra
                }

                for(inicio=0;inicio<=tam;inicio++) //zerando o vetor palavra
                    palavra[inicio] = 0;
                tam = 0; //tamanho do vetor = 0
            }
        }
    }
    free(texto);
    printf("\nNumero de Palindromos encontrados: %d\n", cont);
    return 0;
}

